package com.qf.controller;

import com.qf.pojo.Page;
import com.qf.pojo.Profile;
import com.qf.service.ProfileService;
import com.qf.service.serviceImpl.ProfileServiceImpl;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;

@WebServlet("/List")
public class ProfileController extends BaseServlet {

    /**
     * 跳转到首页
     *
     * @param request
     * @param response
     * @return
     */
    public String index(HttpServletRequest request, HttpServletResponse response) {

        ProfileService profileService = new ProfileServiceImpl();
//      List<Profile> list = profileService.FindAll();

        //获取当前需要跳转到的页数
        String pageIndex = request.getParameter("pageIndex");
        //如果当前页等于null, 那么让他跳转到第一页
        if (pageIndex == null) {
            pageIndex = "1";
        }
        //封装Page分页对象, 第一个参数:当前需要跳转到的页码, 第二个参数:每页显示条数
        Page page = new Page(Integer.parseInt(pageIndex), 5);

        List<Profile> List = profileService.findAllPage(page);

//        System.out.println(List);
        //分页查询, 查询中记录数
        int count = profileService.findAllPageCount();
//      将查询到的总记录数，存入page分页对象中
        page.setTotalCounts(count);

        //使用jsp来展示书籍列表
//        如果重定向到 jsp页面，需要将数据保存到 session
        //如果使用请求转发，可以将数据保存到 request
        request.setAttribute("List", List);

        //将分页对象传给页面展示
        request.setAttribute("page", page);
        //将当前页返回给页面
        request.setAttribute("pageIndex", pageIndex);
        return "forward:/list.jsp";
    }

    /**
     * 跳转到详情页面
     *
     * @param request
     * @param response
     * @return
     */
    public String detail(HttpServletRequest request, HttpServletResponse response) {

        String id = request.getParameter("profileId");


        ProfileService profileService = new ProfileServiceImpl();
        Profile profile = profileService.findProfileById(Integer.parseInt(id));

        request.setAttribute("profile", profile);


        return "forward:/detail.jsp";
    }

    public String update(HttpServletRequest request, HttpServletResponse response) throws Exception {

        //1. 创建文件解析工厂对象
        DiskFileItemFactory factory = new DiskFileItemFactory();

        //2. 从工厂中获取解析器对象
        ServletFileUpload parser = new ServletFileUpload(factory);

        //3. 解决文件名的乱码问题
        parser.setHeaderEncoding("utf-8");

        //4. 判断上传的表单类型, 如果表单中带enctype="multipart/form-data"说明是有上传文件,
        // 如果没有上传的商品图片文件, 添加失败, 跳转到管理员主页
        if (!ServletFileUpload.isMultipartContent(request)) {
            return "redirect:/admin/admin.jsp";
        }

        //5. 调用解析器上传数据
        List<FileItem> fileItems = parser.parseRequest(request);

        //6. 获取保存文件的本地服务器目录路径
        //上传到项目编译后的路径位置: 例如 D:\ideaWorkspace\java2203\out\artifacts\myshop_war_exploded\files
        String uploadPath = request.getServletContext().getRealPath("/files");
        System.out.println("======图片上传后的位置=======" + uploadPath);

        //7. 判断服务器保存文件目录是否存在, 如果目录不存在自动创建文件夹
        File fileDir = new File(uploadPath);
        if (!fileDir.exists()) {
            fileDir.mkdirs();
        }

        Profile profile = new Profile();
        //9. 遍历表单中的每一个元素
        for (FileItem fileItem : fileItems) {

            if (fileItem.isFormField()) {
                //10. 判断如果是普通表单, 将表单数据存入Goods商品对象中
                if (fileItem.getString() == null || "".equals(fileItem.getString())) {
                    continue;
                }
//                //如果是商品分类放入goods对象中
//                if ("typeid".equals(fileItem.getFieldName())) {
//                    goods.setTid(Integer.parseInt(fileItem.getString()));
//                }
                //商品名称
                if ("name".equals(fileItem.getFieldName())) {
                    profile.setName(new String(fileItem.getString().getBytes("ISO-8859-1"), "utf-8"));
                }
                //商品创建时间
                if ("birthday".equals(fileItem.getFieldName())) {
//                    String dateStr = fileItem.getString();
//                    //日期格式化
//                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//                    profile.setBirthday(sdf.parse(dateStr));
                    profile.setBirthday(fileItem.getString());

                }
                //商品价格
                if ("gender".equals(fileItem.getFieldName())) {
                    profile.setGender(fileItem.getString());
                }
                //商品评分
                if ("career".equals(fileItem.getFieldName())) {
                    profile.setCareer(fileItem.getString());
                }
                //商品简介
                if ("address".equals(fileItem.getFieldName())) {
                    profile.setAddress(new String(fileItem.getString().getBytes("ISO-8859-1"), "utf-8"));
                }
                if ("mobile".equals(fileItem.getFieldName())) {
                    profile.setMobile(fileItem.getString());
                }


            } else {
                //11. 判断如果是文件, 则获取上传文件的路径和文件名
                //   c://xxx//xxx//xxx.jpg
                String filePath = fileItem.getName();

                //12. 如果未上传文件, 继续处理下一个字段
                if (filePath == null || "".equals(filePath)) {
                    continue;
                }

                //13. 获取上传文件的文件名
                String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);

                //14. 做io操作, 保存文件到服务器硬盘的指定位置, 获取输入流读取文件
                InputStream inputStream = fileItem.getInputStream();

                //15. 将文件保存在服务器硬盘目录 + 文件名, 组成具体的保存路径
                FileOutputStream out = new FileOutputStream(uploadPath + "\\" + fileName);
                System.out.println("===文件保存后的完整路径===" + uploadPath + "\\" + fileName);

                //创建缓冲区
                byte[] buffer = new byte[1024];
                //读取的长度
                int len = 0;
                //如果读取的长度大于0, 说明读取出来内容了, 可以输出
                while ((len = inputStream.read(buffer)) > 0) {
                    out.write(buffer, 0, len);
                }
                out.close();
                inputStream.close();

                //16. 保存后设置Goods商品对象中图片保存后的路径以及文件名信息
                profile.setPicture("http://localhost:8080/files/" + fileName);
            }

        }
        String id = request.getParameter("profileid");

        ProfileService profileService = new ProfileServiceImpl();
        profileService.update(Integer.parseInt(id), profile);

        request.setAttribute("profile", profile);


        return "redirect:/List?method=index";
    }


}
